// 性能测试脚本
const http = require('k6/http');
const { check, sleep } = require('k6');

// 测试配置
export const options = {
  stages: [
    { duration: '30s', target: 10 },  // 模拟10个用户持续30秒
    { duration: '1m', target: 20 },   // 增加到20个用户持续1分钟
    { duration: '30s', target: 0 },   // 逐渐减少到0用户
  ],
  thresholds: {
    http_req_duration: ['p(95)<500'], // 95%的请求响应时间小于500ms
    http_req_failed: ['rate<0.01'],   // 请求失败率小于1%
  },
};

// 测试数据
const BASE_URL = 'http://localhost:3003';
const TEST_USER = {
  phone: '13800138000',
  password: 'testpassword123',
  username: 'testuser'
};

let authToken = '';

// 设置阶段
export function setup() {
  // 注册测试用户
  const registerRes = http.post(`${BASE_URL}/api/users/register`, JSON.stringify(TEST_USER), {
    headers: { 'Content-Type': 'application/json' },
  });
  
  check(registerRes, {
    '用户注册成功': (r) => r.status === 201 || r.status === 409, // 201表示创建成功，409表示用户已存在
  });
  
  // 登录获取token
  const loginRes = http.post(`${BASE_URL}/api/users/login`, JSON.stringify({
    phone: TEST_USER.phone,
    password: TEST_USER.password
  }), {
    headers: { 'Content-Type': 'application/json' },
  });
  
  check(loginRes, {
    '用户登录成功': (r) => r.status === 200,
  });
  
  if (loginRes.status === 200) {
    const loginData = JSON.parse(loginRes.body);
    authToken = loginData.token;
  }
  
  return { authToken };
}

// 主要测试逻辑
export default function (data) {
  const { authToken } = data;
  const headers = {
    'Authorization': `Bearer ${authToken}`,
    'Content-Type': 'application/json'
  };
  
  // 测试获取账单列表
  const billsRes = http.get(`${BASE_URL}/api/bills`, { headers });
  check(billsRes, {
    '获取账单列表成功': (r) => r.status === 200,
  });
  
  // 测试创建账单
  const newBill = {
    type: 'expense',
    amount: Math.random() * 1000,
    category_id: 1,
    description: '性能测试账单',
    date: new Date().toISOString().split('T')[0]
  };
  
  const createBillRes = http.post(`${BASE_URL}/api/bills`, JSON.stringify(newBill), { headers });
  check(createBillRes, {
    '创建账单成功': (r) => r.status === 201,
  });
  
  // 测试获取分类列表
  const categoriesRes = http.get(`${BASE_URL}/api/categories`, { headers });
  check(categoriesRes, {
    '获取分类列表成功': (r) => r.status === 200,
  });
  
  // 测试获取预算状态
  const budgetRes = http.get(`${BASE_URL}/api/budgets/status`, { headers });
  check(budgetRes, {
    '获取预算状态成功': (r) => r.status === 200,
  });
  
  // 模拟用户思考时间
  sleep(1);
}

// 清理阶段
export function teardown(data) {
  // 可以在这里添加清理逻辑
  console.log('性能测试完成');
}